/*
 * arch/arm/include/asm/vfpmacros.h
 *
 * Assembler-only file containing VFP macros and register definitions.
 */
#include "vfp.h"

@ Macros to allow building with old toolkits(with no VFP support)
    .macro VFPFMRX, rd, sysreg, cond
    MRC \ cond p10, 7, \rd, \sysreg, cr0, 0 @ FMRX \ rd,
    \sysreg.endm.macro VFPFMXR, sysreg, rd, cond MCR \ cond p10, 7, \rd,
    \sysreg, cr0, 0 @ FMXR \ sysreg,
    \rd.endm @ read all the working registers back into the VFP.macro VFPFLDMIA,
    base, tmp
#if __LINUX_ARM_ARCH__ < 6
    LDC p11, cr0,[\base],
#33*4		    @ FLDMIAX \base!, {d0-d15}
#else
    LDC p11, cr0,[\base],
#32*4		    @ FLDMIAD \base!, {d0-d15}
#endif
#ifdef CONFIG_VFPv3
    VFPFMRX \ tmp, MVFR0 @ Media and VFP Feature Register 0 and \ tmp, \tmp,
#MVFR0_A_SIMD_MASK	    @ A_SIMD field
    cmp \ tmp,
#2			    @ 32 x 64bit registers?
    ldceql p11, cr0,[\base],
#32*4		    @ FLDMIAD \base!, {d16-d31}
    addne \ base, \base,
#32*4		    @ step over unused register space
#endif
    .endm
    @ write all the working registers out of the VFP.macro VFPFSTMIA, base, tmp
#if __LINUX_ARM_ARCH__ < 6
    STC p11, cr0,[\base],
#33*4		    @ FSTMIAX \base!, {d0-d15}
#else
    STC p11, cr0,[\base],
#32*4		    @ FSTMIAD \base!, {d0-d15}
#endif
#ifdef CONFIG_VFPv3
    VFPFMRX \ tmp, MVFR0 @ Media and VFP Feature Register 0 and \ tmp, \tmp,
#MVFR0_A_SIMD_MASK	    @ A_SIMD field
    cmp \ tmp,
#2			    @ 32 x 64bit registers?
    stceql p11, cr0,[\base],
#32*4		    @ FSTMIAD \base!, {d16-d31}
    addne \ base, \base,
#32*4		    @ step over unused register space
#endif
    .endm
